1. /* scfcacos.cpp by K.Tsuru */
  2. // function ID = 9115 since ver 2.18
  3. /*****************************************************************
  4. SComplex class
  5. It returns arccos(z).
  6. Cacos(z) = -i * Clog{z + Csqrt(z * z - 1)}.
  7. Let z = x [+|-] i*y
  8. arccos(z) = arccos(x [+|-] i*y) ([+|-]y >= 0)
  9. = arccos[ (1/2){sqrt( (1+x)^2 + y^2 ) - sqrt( (1-x)^2 + y^2 )} ]
  10. [-|+]i*arccosh[ (1/2){sqrt( (1+x)^2 + y^2 ) + sqrt( (1-x)^2 + y^2 )} ] (ref. Iwanami II p.224)
  11. = arccos {(|1+z|-|1-z|)/2} [-|+] i*arccosh {(|1+z|+|1-z|)/2}
  12. When y = 0 i.e. z = x, let arccos(x) = p, cos(p) = x then
  13. |x| <= 1.0 must be satisfied.
  14. ******************************************************************/
  15. #ifndef SN_H
  16. #include "sn.h"
  17. #endif
  18. #define CacosXYMethod 0
  19. #define CacosZ1Method 1
  20. SComplex Cacos(const SComplex& z){
  21. if(Im(z) == 0.0){ // pure real z = x
  22. if(Dabs(Re(z)) > 1.0) {
  23. z.Real().SetError(z.Real().DOMAIN_ERR, "Cacos(z) with z = x(x > 1.0))", 9115);
  24. }
  25. return SComplex(Acos(Re(z)), 0.0); // arccos(x)
  26. }
  27. #if CacosXYMethod // 13.9sec
  28. SDouble x = z.Real(), y = z.Imag(), xp1sq, xm1sq, ysq(y*y), a, b, c, d;
  29. a = 1.0 + x; xp1sq = a * a; // (1+x)^2
  30. a = 1.0 - x; xm1sq = a * a; // (1-x)^2
  31. c = Sqrt(xp1sq + ysq); // sqrt( (1+x)^2 + y^2 )
  32. d = Sqrt(xm1sq + ysq); // sqrt( (1-x)^2 + y^2 )
  33. a = DsDiv(c - d, 2);
  34. a = Acos(a);
  35. b = DsDiv(c + d, 2);
  36. b = Acosh(b); // b > 0
  37. if ( y.Sign(9115) > 0 ) b.ChangeSign(9115);
  38. return SComplex(a, b);
  39. #elif CacosZ1Method // 13.87sec
  40. SComplex zp1(z + 1.0), zm1(z - 1.0);
  41. SDouble azp1, azm1, rp, ip;
  42. azp1 = Cabs(zp1); // |1+z|
  43. azm1 = Cabs(zm1); // |1-z|
  44. rp = DsDiv(azp1 - azm1, 2); // (|1+z|-|1-z|)/2
  45. rp = Acos(rp);
  46. ip = DsDiv(azp1 + azm1, 2); // (|1+z|+|1-z|)/2
  47. ip = Acosh(ip); // ip > 0
  48. if ( z.Imag().Sign(9115) > 0 ) ip.ChangeSign(9115);
  49. return SComplex(rp, ip);
  50. #else // 16.3sec
  51. SComplex p = IU * Clog(IU * z + Csqrt(1.0 - z*z));
  52. p += MPi2();
  53. return p; // pi/2 + i*log{i*z+sqrt(1-z^2)}
  54. #endif
  55. }

scfcacos.cpp : last modifiled at 2016/01/11 11:15:53(2,010 bytes)
created at 2017/10/06 15:21:28
The creation time of this html file is 2017/10/06 15:27:08 (Fri Oct 06 15:27:08 2017).